Ряд.отд
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 
(*~\Глагол\Отделы\Иное~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                        ОТДЕЛ Ряд;
(*============================================================================*)
(* НАЗНАЧЕНИЕ: упорядочивание рядов и поиск в рядах                           *)
(*============================================================================*)
ИСПОЛЬЗУЕТ
  Набор ИЗ "..\Иное\";
(*
ВИД
            (* предок (опора, база) доступа к любому ВИДу набор *)
  Набор.Доступ-=ДОСТУП К Набор.Вид;
            (* предок (опора, база) любого ВИДа набор *)
  Набор.Вид-=НАБОР КОН; 
*)
ВИД
  Вид-   =НАБОР КОН;     (* опорный вид (абстрактный предок) других НАБОРов *)
  Доступ-=ДОСТУП К Вид;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Упоряд-(ряд+:РЯД ИЗ Доступ; всего:ЦЕЛ;
                                  сравнить:ЗАДАЧА(с1-,с2-:Вид):ЦЕЛ);
(* Быстрое упорядочивание с помощью разделения на участки (Ч.Хоар) *)
ПЕР
  Л,П:ЦЕЛ;        (* текущий участок                   *)
  л,п:ЦЕЛ;        (* новый участок                     *)
  граница:Доступ; (* граничное значение для разделение *)
  рядл:Доступ;    (* промежуточное значение для обмена *)
  глубина:ЦЕЛ;    (* текущая глубина стека             *)
  (* стек для новых участков *)
  стек:РЯД 32 ИЗ НАБОР Л,П:ЦЕЛ КОН; 
УКАЗ
  глубина:=0; 
  стек[глубина].Л:=0; 
  стек[глубина].П:=всего-1;
  ПОВТОРЯТЬ
    (* выбор из стека последнего запроса *)
    Л:=стек[глубина].Л; 
    П:=стек[глубина].П;
    УМЕНЬШИТЬ(глубина);
    ПОВТОРЯТЬ
      (* разделение ряд[Л]...ряд[П] *)
      л:=Л; п:=П;
      граница:=ряд[(Л+П) ДЕЛИТЬ 2];
      ПОВТОРЯТЬ
        ПОКА сравнить(ряд[л]^,граница^) < 0 ВЫП УВЕЛИЧИТЬ(л) КОН;
        ПОКА сравнить(граница^,ряд[п]^) < 0 ВЫП УМЕНЬШИТЬ(п) КОН;
        ЕСЛИ л <= п ТО (* обмен ряд[л] с ряд[п] *)
          рядл:=ряд[л];
          ряд[л]:=ряд[п];
          ряд[п]:=рядл;
          УВЕЛИЧИТЬ(л);
          УМЕНЬШИТЬ(п)
        КОН
      ДО л > п;
      ЕСЛИ п-Л < П-л ТО
        ЕСЛИ л < П ТО (* запись в стек запроса на упорядочивание правой части *)
          УВЕЛИЧИТЬ(глубина);
          стек[глубина].Л:=л;
          стек[глубина].П:=П
        КОН;
        П:=п (* продолжение упорядочивания левой части *)
      ИНАЧЕ
        ЕСЛИ Л < п ТО (* запись в стек запроса на упорядочивание левой части *)
          УВЕЛИЧИТЬ(глубина);
          стек[глубина].Л:=Л;
          стек[глубина].П:=п
        КОН;
        Л:=л (* продолжение упорядочивания правой части *)
      КОН
    ДО Л >= П
  ДО глубина < 0
КОН Упоряд;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Поиск-(слаг-:Вид;
               ряд+:РЯД ИЗ Доступ; дл:ЦЕЛ; сравнить:ЗАДАЧА(с1-,с2-:Вид):ЦЕЛ):Доступ;
ПЕР
  пол,рез,нач,всего:ЦЕЛ;
УКАЗ
  нач:=0;
  всего:=дл;
  ПОКА всего > 0 ВЫП
    пол:=всего ДЕЛИТЬ 2;
    рез:=сравнить(слаг,ряд[нач+пол]^);
    ЕСЛИ рез <= 0 ТО
      ЕСЛИ рез = 0 ТО 
        ВОЗВРАТ ряд[нач+пол] 
      КОН;
      всего:=пол
    ИНАЧЕ
      УВЕЛИЧИТЬ(нач,пол+1);
      УМЕНЬШИТЬ(всего,пол+1)
    КОН
  КОН;
  ВОЗВРАТ ПУСТО
КОН Поиск;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Вставка-(слаг:Доступ;
               ряд+:РЯД ИЗ Доступ; дл+:ЦЕЛ; сравнить:ЗАДАЧА(с1-,с2-:Вид):ЦЕЛ);
ПЕР
  пол,рез,нач,всего:ЦЕЛ;
УКАЗ
  нач:=0;
  всего:=дл;
  КОЛЬЦО
    ЕСЛИ всего <= 0 ТО ВЫХОД КОН;
    пол:=всего ДЕЛИТЬ 2;
    рез:=сравнить(слаг^,ряд[нач+пол]^);
    ЕСЛИ рез <= 0 ТО
      ЕСЛИ рез = 0 ТО ВОЗВРАТ КОН;
      всего:=пол
    ИНАЧЕ
      УВЕЛИЧИТЬ(нач,пол+1);
      УМЕНЬШИТЬ(всего,пол+1)
    КОН
  КОН;
  ЕСЛИ дл=РАЗМЕР(ряд) ТО ВОЗВРАТ КОН;
  всего:=дл;
  ПОКА всего > нач ВЫП
    ряд[всего]:=ряд[всего-1];
    УМЕНЬШИТЬ(всего)
  КОН;
  ряд[нач]:=слаг;
  УВЕЛИЧИТЬ(дл)
КОН Вставка;

КОН Ряд.

 
 


Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com

 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы